/***********************************************************************
*
* Copyright (c) 2012-2025 Barbara Geller
* Copyright (c) 2012-2025 Ansel Sermersheim
*
* Copyright (c) 2015 The Qt Company Ltd.
* Copyright (c) 2012-2016 Digia Plc and/or its subsidiary(-ies).
* Copyright (c) 2008-2012 Nokia Corporation and/or its subsidiary(-ies).
*
* This file is part of CopperSpice.
*
* CopperSpice is free software. You can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* version 2.1 as published by the Free Software Foundation.
*
* CopperSpice is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
* https://www.gnu.org/licenses/
*
***********************************************************************/

#include "qdynamiccontext_p.h"
#include "qvalidationerror_p.h"
#include "qitem_p.h"
#include "qanyuri_p.h"

using namespace QPatternist;

AnyURI::AnyURI(const QString &s) : AtomicString(s)
{
}

AnyURI::Ptr AnyURI::fromValue(const QString &value)
{
   return AnyURI::Ptr(new AnyURI(value));
}

AnyURI::Ptr AnyURI::fromValue(const QUrl &uri)
{
   return AnyURI::Ptr(new AnyURI(uri.toString()));
}

AnyURI::Ptr AnyURI::resolveURI(const QString &relative, const QString &base)
{
   const QUrl urlBase(base);
   return AnyURI::fromValue(urlBase.resolved( QUrl(relative) ).toString());
}

ItemType::Ptr AnyURI::type() const
{
   return BuiltinTypes::xsAnyURI;
}

AnyURI::Ptr AnyURI::fromLexical(const QString &value)
{
   bool isValid;

   /* The error code doesn't matter, because we never raise error. */
   const QUrl retval(toQUrl<ReportContext::FORG0001>(value, DynamicContext::Ptr(), nullptr, &isValid, false));

   if (isValid) {
      return fromValue(retval);
   } else {
      return ValidationError::createError();
   }
}

bool AnyURI::isValid(const QString &candidate)
{
   bool isOk = false;
   /* The error code doesn't matter, because we never raise error. */
   toQUrl<ReportContext::FORG0001>(candidate, ReportContext::Ptr(), nullptr, &isOk, false);
   return isOk;
}

